package main

import (
	"fmt"
	"reflect"
)

//编写Cal结构体
//包含Num1和Num2两个字段
//具备GetSub(name string)方法
//反射遍历所有字段
//反射调用GetSub
//最终输出 tom 完成了减法 8-3=5
func main() {
	cal := Cal{}
	// rType := reflect.TypeOf(cal)
	rVal := reflect.ValueOf(&cal) //要想通过反射修改字段值，必须传入指针
	// for i := 0; i < rType.NumField(); i++ {
	// 	fieldName := rType.Field(i).Name
	// 	if fieldName == "Num1" {
	// 		rVal.Elem().Field(i).SetInt(8)
	// 	} else if fieldName == "Num2" {
	// 		rVal.Elem().Field(i).SetInt(3)
	// 	}
	// }

	rVal.Elem().FieldByName("Num1").SetInt(8)
	rVal.Elem().FieldByName("Num2").SetInt(3)

	var params []reflect.Value
	params = append(params, reflect.ValueOf("tom"))

	rVal.MethodByName("GetSub").Call(params)

}

type Cal struct {
	Num1 int32
	Num2 int32
}

func (cal Cal) GetSub(name string) {
	fmt.Printf("%v 完成了减法 %v-%v=%v \n", name, cal.Num1, cal.Num2, cal.Num1-cal.Num2)
}
